VB - Delphi

Otázka od: Jozef Baranec

6. 11. 2002 12:48

Vo Visual Basic mozem zapisat toto:

For each x in y
 ...
next

Da sa to nejako zapisat aj v Delphi?

Dik

jozo

Odpovedá: Tomas Bihary

6. 11. 2002 12:42

Ne,
jedine takhle:

for I := {DOLNI_INDEX} to {HORNI_INDEX} do
begin
  X := Y[I]; // POLOZKA DLE INDEXU
  ...
end;

Ahoj Tomas


----- Original Message -----
Vo Visual Basic mozem zapisat toto:

For each x in y
 ...
next

Da sa to nejako zapisat aj v Delphi?

Odpovedá: Ondrej Kelle

6. 11. 2002 13:02

>> For each x in y
>> ...
>> next
>>
>> Da sa to nejako zapisat aj v Delphi?

VBA Collection je objekt, ktory ma metody Count a Item, mozes teda vo for
cykle pouzit metodu Item(X). Pozor, prvy element ma index 1.
Priklad: v OleContainer1 mam vlozeny Word objekt s niekolkymi odstavcami
textu. Nasledovny kod mi zarovna vsetky odstavce doprava:

var
  Document, Collection: Variant;
  I: Integer;
begin
  Document := OleContainer1.OleObject;
  Collection := Document.Paragraphs;
  for I := 0 to Collection.Count - 1 do
    Collection.Item(I + 1).Alignment := 2;
end;

HTH
TOndrej

Odpovedá: Martin Schayna

6. 11. 2002 15:42

----- Original Message -----
From: "Jozef Baranec" <joba@digitaldocuments.org>
> Vo Visual Basic mozem zapisat toto:
>
> For each x in y
> ...
> next
>
> Da sa to nejako zapisat aj v Delphi?

Pokud je k dispozici v interfacu objektu kolekce indexovana
property Items nebo podobne, muzes je prochazet normalne.
Pokud tam je pouze metoda _NewEnum (s pevne danym DispID
-4), pak to lze pomoci tzv. enumeratoru ktery tato metoda
vraci. Prave tu pouziva VB pro konstrukci For...Each.

Metoda _NewEnum vraci IUnkown interface, ze ktereho se dostanes
na skutecny interface enumeratoru, mam vyzkousene ze vetsinou
funguje interface IEnumVariant deklarovany v ActiveX.pas s metodami
Next, Skip, Reset a Clone. Mozna funguji obcas i jine podobne interfacy
s podobnymi metodami urcene pro enumerovani ruznych jinych typu
(IEnumString...), ale vyzkousene to nemam.

Pak uz staci projit kolekci pomoci volani metody Next na enumeratoru.
Odkazuji na MSDN, z pameti pisu nasledujici kod ale nemusi byt
uplne dobre:

var
  mEnum: IEnumVariant;
  mVar: OleVariant
  n: Integer;
begin
  mEnum := obj._NewEnum as IEnumVariant;
  OLECheck(mEnum.Next(1, mVar, n));
  while (n > 0) do begin
    //v mVar k dispozici IDispatch na objekt v kolekci
    OLECheck(mEnum.Next(1, mVar, n));
  end;
end;

Martin Schayna

Odpovedá: Jozef Baranec

6. 11. 2002 22:41

Dik pomohlo to ...

jozo

----

var
  mEnum: IEnumVariant;
  mVar: OleVariant
  n: Integer;
begin
  mEnum := obj._NewEnum as IEnumVariant;
  OLECheck(mEnum.Next(1, mVar, n));
  while (n > 0) do begin
    //v mVar k dispozici IDispatch na objekt v kolekci
    OLECheck(mEnum.Next(1, mVar, n));
  end;
end;

Martin Schayna